package controllers.Administrador;

import java.util.Collection;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import services.ComunidadDeVecinosService;
import services.CuotaService;
import controllers.AbstractController;
import domain.ComunidadDeVecinos;
import domain.Cuota;
import forms.ComunidadDeVecinosForm;

@Transactional
@Controller
@RequestMapping("/cuota/administrator")
public class CuotaAdministratorController extends AbstractController {

	@Autowired
	private CuotaService cuotaService;

	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView list(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Cuota> cuotas;

		cuotas = cuotaService.findCuotasByComunidadDeVecinosAdministrador(comunidadId);

		result = new ModelAndView("cuota/list");
		result.addObject("requestURI", "cuota/administrator/list.do");
		result.addObject("cuotas", cuotas);
		result.addObject("backURI",
				"/comunidad/administrator/edit.do?comunidadId=" + comunidadId);

		return result;
	}

	@RequestMapping(value = "/unpaidList", method = RequestMethod.GET)
	public ModelAndView unpaidList(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Cuota> cuotas;

		cuotas = cuotaService.findCuotasNoPagadasByComunidadAdministrador(comunidadId);

		result = new ModelAndView("cuota/unpaidList");
		result.addObject("requestURI", "cuota/administrator/unpaidList.do");
		result.addObject("cuotas", cuotas);
		result.addObject("backURI",
				"/comunidad/administrator/edit.do?comunidadId=" + comunidadId);

		return result;
	}

	@RequestMapping(value = "/ordinariasList", method = RequestMethod.GET)
	public ModelAndView ordinariasList(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Cuota> cuotas;

		cuotas = cuotaService.findCuotasOrdinariasByComunidadAdministrador(comunidadId);

		result = new ModelAndView("cuota/ordinariasList");
		result.addObject("requestURI", "cuota/administrator/ordinariasList.do");
		result.addObject("cuotas", cuotas);
		result.addObject("backURI",
				"/comunidad/administrator/edit.do?comunidadId=" + comunidadId);

		return result;
	}

	@RequestMapping(value = "/extraordinariasList", method = RequestMethod.GET)
	public ModelAndView extraordinariasList(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Cuota> cuotas;

		cuotas = cuotaService.findCuotasExtraordinariasByComunidadAdministrador(comunidadId);

		result = new ModelAndView("cuota/extraordinariasList");
		result.addObject("requestURI",
				"cuota/administrator/extraordinariasList.do");
		result.addObject("cuotas", cuotas);
		result.addObject("backURI",
				"/comunidad/administrator/edit.do?comunidadId=" + comunidadId);

		return result;
	}

	@RequestMapping(value = "/generate", method = RequestMethod.GET)
	public ModelAndView generateFees(@RequestParam int comunidadId) {
		ModelAndView result;
		Collection<Cuota> cuotas;
		Boolean disponibleCuotaOrdinaria;

		disponibleCuotaOrdinaria = cuotaService
				.haPasado1mesDesdeCuotaOrdinaria(comunidadId);
		if (!disponibleCuotaOrdinaria) {
			result = createEditModelAndView(comunidadId,
					"cuota.noHaPasado1MesDesdeOrdinaria.error");
		} else {
			try {
				cuotaService.generateFees(comunidadId);

				cuotas = cuotaService
						.findCuotasOrdinariasByComunidadAdministrador(comunidadId);

				result = new ModelAndView("cuota/ordinariasList");
				result.addObject("requestURI",
						"cuota/administrator/ordinariasList.do");
				result.addObject("cuotas", cuotas);
				result.addObject("backURI",
						"/comunidad/administrator/edit.do?comunidadId="
								+ comunidadId);
			} catch (Throwable oops) {

				result = createEditModelAndView(comunidadId,
						"couta.generarOrdinarias.error");
			}
		}
		return result;
	}

	protected ModelAndView createEditModelAndView(int comunidadId,
			String message) {
		ModelAndView result;

		result = new ModelAndView("comunidad/edit");

		ComunidadDeVecinosForm cvForm;
		ComunidadDeVecinos cv;
		Boolean hasPresident;

		cv = comunidadDeVecinosService.findOne(comunidadId);
		cvForm = comunidadDeVecinosService.comunidadToForm(cv);
		hasPresident = cv.getPresidente() != null;

		result.addObject("cvForm", cvForm);
		result.addObject("comunidadId", comunidadId);
		result.addObject("hasPresident", hasPresident);
		result.addObject("requestURI", "comunidad/administrator/edit.do");
		result.addObject("backURI", "/welcome/index.do");

		result.addObject("message", message);

		return result;
	}
}
